/*!
 * \file IBtDtReader.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 回测数据读取接口定义
 * \details 定义了回测数据读取模块的核心接口，包括回测数据读取回调和主要数据读取功能
 */
#pragma once
#include <string>

#include "../Includes/WTSTypes.h"

NS_WTP_BEGIN
class WTSVariant;

/**
 * @class IBtDtReaderSink
 * @brief 回测数据读取模块回调接口
 * @details 定义了回测数据读取模块与其他模块交互的回调接口。
 *          主要功能包括：
 *          - 日志输出
 *          
 *          该接口由数据使用方实现，用于接收回测数据读取模块的通知。
 */
class IBtDtReaderSink
{
public:
	/**
	 * @brief 输出回测数据读取模块日志
	 * @details 用于回测数据读取模块输出日志信息。
	 * 
	 * @param ll 日志级别
	 * @param message 日志消息内容
	 */
	virtual void		reader_log(WTSLogLevel ll, const char* message) = 0;
};

/**
 * @class IBtDtReader
 * @brief 回测数据读取接口
 * @details 回测数据读取模块提供的核心数据（tick和K线）读取接口。
 *          主要功能包括：
 *          - 模块初始化和配置
 *          - 原始K线数据读取
 *          - 原始tick数据读取
 *          
 *          该接口是回测数据读取模块的核心，由具体的数据存储实现类继承。
 *          与IDataReader不同，IBtDtReader专门用于回测场景，
 *          读取的是历史数据文件中的原始数据。
 */
class IBtDtReader
{
public:
	IBtDtReader() :_sink(NULL) {}
	virtual ~IBtDtReader(){}

public:
	/**
	 * @brief 初始化回测数据读取模块
	 * @details 使用配置参数初始化回测数据读取模块，设置回调接口。
	 * 
	 * @param cfg 模块配置参数
	 * @param sink 模块回调接口
	 */
	virtual void init(WTSVariant* cfg, IBtDtReaderSink* sink) { _sink = sink; }

	/**
	 * @brief 读取原始K线数据
	 * @details 从数据存储中读取指定合约和周期的原始K线数据。
	 *          返回的数据格式为二进制缓冲区，需要进一步解析。
	 * 
	 * @param exchg 交易所代码
	 * @param code 合约代码
	 * @param period K线周期
	 * @param buffer 输出缓冲区，存储读取的原始K线数据
	 * @return bool 读取是否成功
	 */
	virtual bool read_raw_bars(const char* exchg, const char* code, WTSKlinePeriod period, std::string& buffer) = 0;
	
	/**
	 * @brief 读取原始tick数据
	 * @details 从数据存储中读取指定合约和日期的原始tick数据。
	 *          返回的数据格式为二进制缓冲区，需要进一步解析。
	 * 
	 * @param exchg 交易所代码
	 * @param code 合约代码
	 * @param uDate 数据日期，格式为yyyyMMdd
	 * @param buffer 输出缓冲区，存储读取的原始tick数据
	 * @return bool 读取是否成功
	 */
	virtual bool read_raw_ticks(const char* exchg, const char* code, uint32_t uDate, std::string& buffer) = 0;

protected:
	IBtDtReaderSink*	_sink;		///< 回测数据读取回调接口
};

/**
 * @typedef FuncCreateBtDtReader
 * @brief 创建回测数据读取器函数指针类型
 * @details 用于动态库中创建回测数据读取器实例的函数指针。
 */
typedef IBtDtReader* (*FuncCreateBtDtReader)();

/**
 * @typedef FuncDeleteBtDtReader
 * @brief 删除回测数据读取器函数指针类型
 * @details 用于动态库中删除回测数据读取器实例的函数指针。
 * 
 * @param store 要删除的回测数据读取器指针
 */
typedef void(*FuncDeleteBtDtReader)(IBtDtReader* store);

NS_WTP_END